package com.shuwen.gcdj.common.util.file;

import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;

/***
 ** Created by ljf
 ** Date:2023/3/16
 */
public class FileUploadUtil {

    /**
     * 得到filename文件名的后缀名
     * @param filename  文件名
     *                 aasdsad.jpg asaa.gif
     * @return
     */
    public static String getFileSuffix(String filename){
        if(filename == null || filename.isEmpty()){
            throw new RuntimeException("文件名不能为空,filename:"+filename);
        }
        return filename.substring(filename.lastIndexOf("."));
    }

    /**
     * 使用UUID生成一个唯一的字符串
     * @return
     */
    public static String randomFilename(){
        return UUID.randomUUID().toString().replaceAll("-","");
    }

    /**
     * 基于时间戳生成文件名
     * @return
     */
    public static String randomFilename2(){
        return System.currentTimeMillis()+"";
    }
    /**
     * 基于时间戳 + UUID生成文件名
     * @return
     */
    public static String randomFilename3(){
        return System.currentTimeMillis()+randomFilename();
    }


    /**
     * 创建目录
     */
    public static void mkdir(String path){
        File file = new  File(path);
        if(!file.exists()){ //不存在
            file.mkdirs();
        }
    }

    /**
     * 基于当前时间创建文件名
     */
    public static String getTimeFilename(){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyy-MM-dd-HH-mm-ss");
        Date date = new Date(System.currentTimeMillis());
        return simpleDateFormat.format(date)+"-"+randomFilename2();
    }

    public static String doPath(String filename, String savePath, MultipartFile file){
        String dbPath = "";
        try {
            dbPath += filename;
            file.transferTo(new File(savePath, filename));
            dbPath = savePath +"/"+ dbPath;
        }catch (Exception e){

        }
        return dbPath;
    }

    //获取文件夹下文件名的最大值
    public static int getMaxFileName(String basePath){
        File dir = new File(basePath);
        List<File> allFileList = new ArrayList<>();
        List<Integer> maxList = new ArrayList<>();
        // 判断文件夹是否存在
        /*if (!dir.exists()) {
            throw new Exception(0l);
        }*/
        getAllFile(dir, allFileList);
        if (allFileList.isEmpty()){
            return 1;
        }
        for (File file : allFileList) {
            String name = file.getName();
            String[] split = name.split("-")[name.split("-").length - 1].split("\\.");
            String s = split[0];
            maxList.add(Integer.valueOf(s));
        }
        Integer maxVersion = maxList.stream().max(Integer::compareTo).get()+1;
        return maxVersion;
    }
    public static void getAllFile(File fileInput, List<File> allFileList) {
        // 获取文件列表
        File[] fileList = fileInput.listFiles();
        assert fileList != null;
        for (File file : fileList) {
            if (file.isDirectory()) {
                // 递归处理文件夹
                // 如果不想统计子文件夹则可以将下一行注释掉
                //getAllFile(file, allFileList);
            } else {
                // 如果是文件则将其加入到文件数组中
                allFileList.add(file);
            }
        }
    }

    /**
     * 有序生成文件名
     */
    public static String getMaxFilename(String basePath){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyy-MM-dd-HH-mm-ss");
        Date date = new Date(System.currentTimeMillis());
        return simpleDateFormat.format(date)+"-"+getMaxFileName(basePath);
    }

}
